import functools

from flask import g
from flask import current_app
from flask import session



def index_class_filter(index):
    if index==0:
        return "first"
    if index==1:
        return "second"
    if index==2:
        return "third"


# @functools.wraps 则可以将原函数对象的指定属性复制给包装函数对象,
# 默认有 __module__、__name__、__doc__,或者通过参数选择。

# 定义一个装饰器函数在函数调用前先查询user_id的cookie是否存在,
# 根据cookie查询user_id,取数据库查询该用户信息,用g变量将该用户信息传递给被修饰的函数
def user_login_data(func):
    @functools.wraps(func)
    def wrapper(*args, **kwargs):
        # 根据浏览器的cookie在redis查询session数据,
        # 在查询到的session数据中查询user_id对应的值
        user_id = session.get("user_id", None)

        user = None
        if user_id:
            try:
                from info.models import User
                user = User.query.get(user_id)
            except Exception as e:
                current_app.logger.error(e)
        # 运行测试，g变量是一个应用上下文变量，类似于一个全局变量，
        # 但是g变量里面的保存的值是相对于每次请求的，不同的请求，g
        # 变量里面保存的值是不同的，所以同一次请求，可以使用g
        #  变量来保存值用于进行函数的传递
        g.user = user
        result = func(*args, **kwargs)
        return result
    return wrapper
